libp2.c#includevoidpixman(){printf("pixmaninlibp1\n");}libc2.c#includevoidpixman();voidcairo(){printf("cairo2\n");pixman();}main.c#include#includevoidpixman(){printf("pixmaninmain\n");}intmain(){pixman();void*handle=NULL;void(*callfun)();handle=dlopen("/home/zpeng/test/so_test/libc2.so",RTLD_L
libp2.c#includevoidpixman(){printf("pixmaninlibp1\n");}libc2.c#includevoidpixman();voidcairo(){printf("cairo2\n");pixman();}main.c#include#includevoidpixman(){printf("pixmaninmain\n");}intmain(){pixman();void*handle=NULL;void(*callfun)();handle=dlopen("/home/zpeng/test/so_test/libc2.so",RTLD_L
是否可以在未解析的符号引用发生时捕获它们,以便调用一个函数来尝试根据需要解析符号?或者是否可以在运行时向动态符号表添加新符号而不创建库文件并打开它?我在GNU/Linux上,使用GCC。(对其他Unix的可移植性会很好,但这不是关键问题。)提前致谢!编辑:我应该更详细地说明我正在尝试做什么。我想为一种编程语言编写一个解释器,它应该支持编译的(dlopen'ed)和解释的模块。我希望从已编译模块调用在别处定义的函数由链接器解析,以避免在每次调用时查找函数,但对解释代码的调用将无法解析。我想捕获这些调用,以便我可以在需要时调用适当的解释函数(或者如果该函数不存在则发出错误信号)。
是否可以在未解析的符号引用发生时捕获它们,以便调用一个函数来尝试根据需要解析符号?或者是否可以在运行时向动态符号表添加新符号而不创建库文件并打开它?我在GNU/Linux上,使用GCC。(对其他Unix的可移植性会很好,但这不是关键问题。)提前致谢!编辑:我应该更详细地说明我正在尝试做什么。我想为一种编程语言编写一个解释器,它应该支持编译的(dlopen'ed)和解释的模块。我希望从已编译模块调用在别处定义的函数由链接器解析,以避免在每次调用时查找函数,但对解释代码的调用将无法解析。我想捕获这些调用,以便我可以在需要时调用适当的解释函数(或者如果该函数不存在则发出错误信号)。
我有一个程序:#includeintcall(){intx=25;++x;returnx;}intmain(){intp;p=call();printf("%d",p);return0;}当我使用-g选项编译程序并使用valgrind运行它时,它显示:==15469==1errorsincontext1of8:==15469==Conditionaljumpormovedependsonuninitialisedvalue(s)==15469==at0x546F83:_dl_relocate_object(in/lib/ld-2.12.90.so)==15469==by0x53E6CC
我有一个程序:#includeintcall(){intx=25;++x;returnx;}intmain(){intp;p=call();printf("%d",p);return0;}当我使用-g选项编译程序并使用valgrind运行它时,它显示:==15469==1errorsincontext1of8:==15469==Conditionaljumpormovedependsonuninitialisedvalue(s)==15469==at0x546F83:_dl_relocate_object(in/lib/ld-2.12.90.so)==15469==by0x53E6CC
我们有一个链接多个静态库的程序,这些静态库可能会或可能不会定义一些符号,具体取决于编译选项。在OSX上,我们使用带有NULL句柄的dlsym(3)来获取符号地址。然而,在Linux上,dlsym(3)总是返回NULL。考虑一个简单的程序(下面的源代码)链接到一个包含一个函数和一个变量的静态库中,并尝试打印它们的地址。我们可以检查程序是否包含符号:$nm-Ctest|grep"test\(func\|var\)"0000000000400715TtestFunc0000000000601050BtestVar但是程序运行时,两者都找不到:$./testtestVar:(nil)testF
我们有一个链接多个静态库的程序,这些静态库可能会或可能不会定义一些符号,具体取决于编译选项。在OSX上,我们使用带有NULL句柄的dlsym(3)来获取符号地址。然而,在Linux上,dlsym(3)总是返回NULL。考虑一个简单的程序(下面的源代码)链接到一个包含一个函数和一个变量的静态库中,并尝试打印它们的地址。我们可以检查程序是否包含符号:$nm-Ctest|grep"test\(func\|var\)"0000000000400715TtestFunc0000000000601050BtestVar但是程序运行时,两者都找不到:$./testtestVar:(nil)testF
让我们通过示例代码。ctest1.c#includevoidctest1(int*i){printf("Thisisfromctest1\n");//outputofthisismissing*i=15;return;}ctest2.c#includevoidctest2(int*i){printf("Thisisfromctest2\n");//outputofthisismissing*i=100;return;}ctest.hvoidctest1(int*);voidctest2(int*);现在让我们从中创建c库gcc-Wall-cctest1.cctest2.car-cvql
让我们通过示例代码。ctest1.c#includevoidctest1(int*i){printf("Thisisfromctest1\n");//outputofthisismissing*i=15;return;}ctest2.c#includevoidctest2(int*i){printf("Thisisfromctest2\n");//outputofthisismissing*i=100;return;}ctest.hvoidctest1(int*);voidctest2(int*);现在让我们从中创建c库gcc-Wall-cctest1.cctest2.car-cvql